#pragma once

#include <iostream>  // 包含输入输出流头文件，用于打印日志信息到标准输出
#include <string>    // 包含字符串处理头文件（目前未用到，但方便后续扩展）
#include <cstdarg>   // 包含可变参数相关的头文件，用于处理变参函数
#include <ctime>     // 包含时间相关函数头文件，用于获取当前时间
#include <unistd.h>  // 包含Unix系统API头文件，用于获取当前进程ID

// 定义日志等级的宏，用于表示不同的日志级别
#define DEBUG 0   // 调试信息
#define NORMAL 1  // 正常信息
#define WARNING 2 // 警告信息
#define ERROR 3   // 错误信息
#define FATAL 4   // 致命错误信息

// 定义一个常量用于限制日志前缀和内容的最大字符数
#define NUM 1024


// 将日志级别转换为对应的字符串表示
const char *to_levelstr(int level)
{
    switch (level)
    {
    case DEBUG:
        return "DEBUG";  // 如果日志级别是DEBUG，返回"DEBUG"字符串
    case NORMAL:
        return "NORMAL"; // 如果日志级别是NORMAL，返回"NORMAL"字符串
    case WARNING:
        return "WARNING"; // 如果日志级别是WARNING，返回"WARNING"字符串
    case ERROR:
        return "ERROR";  // 如果日志级别是ERROR，返回"ERROR"字符串
    case FATAL:
        return "FATAL";  // 如果日志级别是FATAL，返回"FATAL"字符串
    default:
        return nullptr;  // 如果日志级别未定义，返回空指针
    }
}

// 用于记录日志信息的函数
// 参数：
// - level: 日志级别（DEBUG、NORMAL、WARNING等）
// - format: 格式化字符串，用于指定日志内容
// - ...: 可变参数，用于传递日志内容中的具体值
void logMessage(int level, const char *format, ...)
{
    // 定义日志前缀，包含日志级别、时间戳和进程ID
    char logprefix[NUM];

    // 通过snprintf格式化日志前缀，保证安全性
    snprintf(logprefix, sizeof(logprefix), "[%s][%ld][pid: %d]", 
             to_levelstr(level),         // 转换日志级别为字符串
             (long int)time(nullptr),   // 获取当前时间戳（秒级别）
             getpid());                 // 获取当前进程的PID

    // 定义一个数组存储日志的具体内容
    char logcontent[NUM];

    // 声明一个可变参数列表
    va_list arg;           
    va_start(arg, format); // 初始化可变参数列表，传入最后一个固定参数

    // 将格式化的日志内容存入logcontent数组
    vsnprintf(logcontent, sizeof(logcontent), format, arg); 

    va_end(arg); // 结束可变参数的使用

    // 将日志前缀和内容一起输出到标准输出
    std::cout << logprefix << logcontent << std::endl;
}
